package com.xinghe.sharedevice.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xinghe.sharedevice.domain.Region;
import com.xinghe.sharedevice.mapper.RegionMapper;
import com.xinghe.sharedevice.service.IRegionService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * @author 星河一叶Ck
 * @date 2025/5/27
 */

@Service
@RequiredArgsConstructor
public class RegionServiceImpl extends ServiceImpl<RegionMapper, Region> implements IRegionService {

    private final RegionMapper regionMapper;

    @Override
    public List<Region> treeSelect(String parentCode) {
        // 获取该父级代码的所有子级
        LambdaQueryWrapper<Region> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Region::getParentCode, parentCode);
        List<Region> regions = regionMapper.selectList(queryWrapper);

        if (CollectionUtils.isEmpty(regions)) {
            return Collections.emptyList();
        }

        // 比如说福建省 然后regions就获取到所有下面的市级 然后每个市级对象里面还有个属性就是判断该市级下面
        // 还有没有子级 如果有 就还能发请求 若没有就不发请求了
        // regions.forEach(region -> {
        //     LambdaQueryWrapper<Region> regionLambdaQueryWrapper = new LambdaQueryWrapper<>();
        //     // 将查询到的子级 这次作为父级代码
        //     regionLambdaQueryWrapper.eq(Region::getParentCode, region.getCode());
        //     // 若有数量那么设置为true否则设置为false
        //     region.setHasChildren(regionMapper.selectCount(regionLambdaQueryWrapper) > 0);
        // });

        // 上面循环查询数据库操作性能非常差 所以这里进行优化 优化后仅仅2次数据库查询
        // 提取所有子级的code作为可能的父级代码
        Set<String> possibleParentCodes  = regions.stream().map(Region::getCode).collect(Collectors.toSet());

        if (possibleParentCodes.isEmpty()) {
            return regions; // 如果没有子级那么直接返回
        }

        // 批量查询这些code下是否有子级
        LambdaQueryWrapper<Region> childQueryWrapper  = new LambdaQueryWrapper<>();
        childQueryWrapper.in(Region::getParentCode, possibleParentCodes) // 将查询到的子级作为父级代码进行查询
                .select(Region::getParentCode); // 不需要地区玩整体 因为我们只需要判断某个父级代码是否存在子级
        List<Region> childRegions = regionMapper.selectList(childQueryWrapper); // 查询所有的

        //  使用Map统计每个父级code下的子级数
        Map<String, Long> parentCodeCountMap  = childRegions.stream()
                .collect(Collectors.groupingBy(Region::getParentCode, Collectors.counting()));
        // 遍历赋值
        regions.forEach(region -> {
            region.setHasChildren(parentCodeCountMap.getOrDefault(region.getCode(), 0L) > 0);
        });
        return regions;
    }

    @Override
    public String getNameByCode(String code) {
        if (StringUtils.isEmpty(code)) {
            return "";
        }

        Region region = regionMapper.selectOne(new LambdaQueryWrapper<Region>()
                .eq(Region::getCode, code).select(Region::getName));

        if (region != null) {
            return region.getName();
        }
        return "";
    }
}
